LWG Welcome to ICTSC!

概要

ssh接続先で作業しているとき暇になった。
しかし、何のアプリを開いているか上司に監視されているため、コンソールしか遊ぶものがない。
ちょうどいいことに、接続先の環境がubuntu20.04であることに気がついた。
ソースコードを残すと遊んでいたことがバレてしまうため、一行のbashコマンドのみで動作を終わらせる必要がある。
試しに一行のbashコマンドのみを用いてコンソール上で次のように描画してみよう。

1.
色のブロックでICTSCと表記してみよう。
縦5ブロック、横26ブロック。
ANSIエスケープシーケンスで左から一文字ずつ順に赤、シアン、青、黄、緑色です。

2.
AAで大きく表示された”Welcome to ICTSC!”という文字列を画像のように動作させてみよう。
文字の切り替わる速さは0.2秒ぐらいが見やすい。

前提条件

bashのコマンドのみを用いること

一行のコマンドを解答に記載すること

問題1については縦5ブロック横26ブロックで表示すること

初期状態

figletコマンドがインストール済み

問題環境

Ubuntu20.04に対して、figletコマンドがインストール済み

終了状態

指定された画像と同じ結果が描画される

解説

概要

1.
ANSIエスケープシーケンスでそれぞれの背景色を力技でプロットしていきます。
テクニックとして、色のブロックはx1b[4&mx1b[mの間の数字が変わっているだけなので、各色に対応する数字だけをプロットし、その前後にx1b[4&mx1b[mを追加することにより、短くすることが出来ます。
これ以上短くしようとすると行列や図形的なアプローチが必要になりそう…

2.
“Welcome to ICTSC”という文字列の先頭の文字を最後尾に持ってくるのをループさせて、それをfigletで大文字表示することでことで描画できます。
シェル変数を定義して文字列の変更を制御した場合は、trapコマンドを用いて動作終了時に設定したシェル変数を削除するとなおよし

解答例

1.


echo -e "111  6666 44444  333  2222n 1  6       4   3    2n 1  6       4    33  2n 1  6       4      3 2   n111  6666   4   333   2222" | sed 's/ /  /g' | sed 's/[^ ]/x1b[4&m  x1b[m/g'

2.


trap "unset string" SIGINT ; string="Welcome to ICTSC ! "; while true; do echo -ne "33[2J33[;H" "$(figlet -w 300 ${string})"; string="${string:1}${string:0:1}"; sleep 0.25; done

余談だが、コードブロックを使っていないため、ソースコードが提出時に自動で文字列として整形されてしまい、コードが崩れ、0と採点されているチームが多く見受けられ、次回からはソースコードの貼り付けにはコードブロック必須にするべきかと考えている。

採点基準

  1. なんらかの形で大きくICTSCと出力できていれば+10%、色がついていれば+20%
    • 縦5ブロック、横26ブロックに反していると -6%
  2. figlet、もしくは力技でWelcome to ICTSCと出力されていれば+20%、文字列を右から左に流れる動作ができていれば+50%